package cn.edu.swu.lyt;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 常量：用于在 ServletContext 中存储留言列表的 Key
    private static final String MESSAGE_LIST_KEY = "messageList";

    /**
     * 【生命周期方法】在 Servlet 第一次初始化时调用
     * 从文件加载已有的留言数据
     */
    @Override
    public void init() throws ServletException {
        // 获取应用上下文对象
        ServletContext context = this.getServletContext();

        // 检查留言列表是否已存在（防止多次初始化）
        if (context.getAttribute(MESSAGE_LIST_KEY) == null) {
            // 从文件加载留言数据
            List<Message> messageList = MessageStorage.loadMessages();

            // 如果没有数据，创建初始列表并添加示例留言
            if (messageList.isEmpty()) {
                messageList = Collections.synchronizedList(new ArrayList<>());
                messageList.add(new Message("系统管理员", "欢迎使用留言板！您的留言将被永久保存。"));
                // 保存初始数据
                MessageStorage.saveMessages(messageList);
                System.out.println("创建初始留言列表并保存");
            } else {
                // 确保列表是线程安全的
                messageList = Collections.synchronizedList(messageList);
                System.out.println("从文件加载留言列表完成，共 " + messageList.size() + " 条留言");
            }

            // 将列表存入应用范围 (ServletContext)
            context.setAttribute(MESSAGE_LIST_KEY, messageList);
        }
    }

    /**
     * 【核心】处理 HTTP POST 请求：接收并保存新留言
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置请求编码，处理中文乱码
        request.setCharacterEncoding("UTF-8");

        // 2. 获取 POST 参数
        String name = request.getParameter("name");
        String content = request.getParameter("message");

        // 简单的输入校验
        if (name != null && !name.trim().isEmpty() && content != null && !content.trim().isEmpty()) {

            // 3. 封装 Message 对象
            Message newMessage = new Message(name.trim(), content.trim());

            // 4. 获取共享的留言列表并添加新留言
            ServletContext context = this.getServletContext();
            @SuppressWarnings("unchecked")
            List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

            // 留言添加到列表的头部 (索引 0)，实现最新留言在上面
            messageList.add(0, newMessage);

            // 5. 【新增】保存到文件
            MessageStorage.saveMessages(messageList);
            System.out.println("新留言已保存: " + newMessage);
        }

        // 6. 【关键】处理完数据后，重定向到 GET 请求，防止 F5 刷新导致重复提交
        response.sendRedirect("message");
    }

    /**
     * 【核心】处理 HTTP GET 请求：展示所有历史留言和输入表单
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 1. 设置响应编码，确保输出的 HTML 页面正确显示中文
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 2. 获取共享的留言列表
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

        // 3. 开始构建 HTML 响应
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><head><title>西大留言板</title>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<link rel='stylesheet' type='text/css' href='style.css'>");
        out.println("</head><body>");
        out.println("<div class='container'>");

        // 4. 统计信息头部
        out.println("<div class='header'>");
        out.println("<h1>西大留言板</h1>");
        out.println("<p>分享您的想法，留言将永久保存</p>");
        out.println("</div>");

        // 5. 统计卡片
        out.println("<div class='stats-card card'>");
        out.println("<div class='stats-container'>");
        out.println("<div class='stat-item'>");
        out.println("<div class='stat-number'>" + messageList.size() + "</div>");
        out.println("<div class='stat-label'>总留言数</div>");
        out.println("</div>");

        // 如果有留言，显示最新留言时间
        if (!messageList.isEmpty()) {
            Message latestMessage = messageList.get(0);
            out.println("<div class='stat-item'>");
            out.println("<div class='stat-text'>" + latestMessage.getFormattedTimestamp() + "</div>");
            out.println("<div class='stat-label'>最新留言时间</div>");
            out.println("</div>");
        }

        out.println("<div class='stat-item'>");
        out.println("<div class='stat-number'>" + getUniqueUsers(messageList) + "</div>");
        out.println("<div class='stat-label'>参与人数</div>");
        out.println("</div>");
        out.println("</div>");
        out.println("</div>");

        // 6. 留言表单
        out.println("<div class='card'>");
        out.println("<h2>留下您的印记</h2>");
        out.println("<form action='message' method='POST'>");
        out.println("<div class='form-group'>");
        out.println("<label for='name'>昵称:</label>");
        out.println("<input type='text' id='name' name='name' required placeholder='请输入您的昵称'>");
        out.println("</div>");
        out.println("<div class='form-group'>");
        out.println("<label for='message'>留言内容:</label>");
        out.println("<textarea id='message' name='message' rows='4' required placeholder='请输入您的留言内容...'></textarea>");
        out.println("</div>");
        out.println("<button type='submit' class='btn'>提交留言</button>");
        out.println("</form>");
        out.println("</div>");

        out.println("<div class='divider'></div>");

        // 7. 历史留言
        out.println("<div class='card'>");
        out.println("<div class='table-header'>");
        out.println("<h2>历史留言</h2>");
        out.println("<div class='message-count'>共 " + messageList.size() + " 条留言</div>");
        out.println("</div>");

        if (messageList.isEmpty()) {
            out.println("<div class='empty-state'>");
            out.println("<p>暂无留言，快来发表第一条留言吧！</p>");
            out.println("</div>");
        } else {
            out.println("<table class='message-table'>");
            out.println("<tr><th>昵称</th><th>留言内容</th><th>时间</th></tr>");

            // 遍历列表，动态生成表格行
            for (Message msg : messageList) {
                out.println("<tr>");
                out.println("<td class='username'>" + msg.getName() + "</td>");
                out.println("<td class='message-content'>" + msg.getContent() + "</td>");
                out.println("<td class='timestamp'>" + msg.getFormattedTimestamp() + "</td>");
                out.println("</tr>");
            }

            out.println("</table>");
        }
        out.println("</div>");

        // 8. 数据管理功能
        out.println("<div class='card'>");
        out.println("<h3>数据管理</h3>");
        out.println("<div class='data-management'>");
        out.println("<form action='message?action=backup' method='POST' style='display: inline;'>");
        out.println("<button type='submit' class='btn btn-secondary'>备份数据</button>");
        out.println("</form>");
        out.println("<form action='message?action=clear' method='POST' style='display: inline; margin-left: 10px;'>");
        out.println("<button type='submit' class='btn btn-danger' onclick='return confirm(\"确定要清空所有留言吗？此操作不可撤销！\")'>清空留言</button>");
        out.println("</form>");
        out.println("</div>");
        out.println("</div>");

        // 9. 首页链接
        out.println("<div style='text-align: center; margin-top: 20px;'>");
        out.println("<a href='index.html' class='home-link'>← 返回首页</a>");
        out.println("</div>");

        out.println("</div>");
        out.println("</body></html>");
    }

    /**
     * 处理其他操作（备份、清空等）
     */
    @Override
    protected void doDelete(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String action = request.getParameter("action");
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

        if ("clear".equals(action)) {
            // 清空留言
            messageList.clear();
            MessageStorage.saveMessages(messageList);
            System.out.println("所有留言已清空");
        } else if ("backup".equals(action)) {
            // 备份数据
            MessageStorage.backupMessages(messageList);
        }

        response.sendRedirect("message");
    }

    // 【辅助方法】计算唯一用户数
    private int getUniqueUsers(List<Message> messages) {
        if (messages == null || messages.isEmpty()) {
            return 0;
        }

        java.util.Set<String> uniqueUsers = new java.util.HashSet<>();
        for (Message msg : messages) {
            uniqueUsers.add(msg.getName());
        }
        return uniqueUsers.size();
    }

    /**
     * Servlet 销毁时保存数据（确保数据不丢失）
     */
    @Override
    public void destroy() {
        ServletContext context = this.getServletContext();
        @SuppressWarnings("unchecked")
        List<Message> messageList = (List<Message>) context.getAttribute(MESSAGE_LIST_KEY);

        if (messageList != null) {
            MessageStorage.saveMessages(messageList);
            System.out.println("Servlet 销毁前保存留言数据: " + messageList.size() + " 条留言");
        }

        super.destroy();
    }
}